import {FormControl, FormGroup, ValidatorFn} from "@angular/forms";

/**
 * Created by 陈文豪 on 2017/1/9.
 */

export class ValidationService {
  static getValidatorErrorMessage(validatorName: string, validatorValue?: any) {
    const config = {
      'required': '必填',
      'invalidPhoneNumber': '您输入的手机号码有误',
      'userNotExist': '用户不存在',
      'userExisted': '用户已注册',
      'phoneNumberNull': '手机号码不能为空',
      'passwordLimitLength': '密码长度应在6-16位',
      'loginSuccess': '登录成功',
      'InvalidVerifyCode': '验证码错误',
      'passwordInconformity': '两次输入密码不一致',
      'passwordFormatError': '您输入的密码格式有误',
      'passwordIsChanged': '密码修改成功',
      'registerSuccess': '注册成功,已登录',
      'nicknameExisted': '该昵称已被使用',
      'minlength': '密码长度应在6-16位之间',
      'maxLength': '密码长度应在6-16位之间',
      'accountlength': '用户名长度应该在6-50位之间',
      'invalidNickname': '昵称长度在4~20个字符以内(不区分英文和汉字),昵称只能由汉字、数字、英文和下划线组成.'
    };

    return config[validatorName];
  }

  static accountValidator(control) {

    // if (!control.value.match(/^1[2345789]\d{9}$/)) {
    //   return {'invalidPhoneNumber': true};
    // } else {
    //   return null;
    // }
    return /^1[2345789]\d{9}$/.test(control.value) ? null : {'invalidPhoneNumber': true};
  }

  static passwordValidator(control) {
    // if (!control.value.match(/^[\w]{6,16}$/)) {
    //   return {'passwordLimitLength': true};
    // } else {
    //   return null;
    // }
    return /^[\w]{6,16}$/.test(control.value) ? null : {'passwordLimitLength': true};
  }

  static matchingPasswords(passwordKey: string, confirmPasswordKey: string) {
    return (group: FormGroup): { [key: string]: any } => {
      const password = group.controls[passwordKey];
      const confirmPassword = group.controls[confirmPasswordKey];
      if (password.value !== confirmPassword.value) {
        return {'passwordInconformity': true};
      } else {
        return null;
      }
    };
  }

  // 中英文
  static nickNameValidator(control) {
    if (!control.value.match(/^[0-9a-zA-Z\u4e00-\u9fa5_]{2,20}$/)) {
      return {'invalidAccount': true};
    } else {
      return null;
    }
  }

  // 中英文 空格但不能是 全部空格
  static nickNameSpaceValidator(control) {
    const value = control.value;
    const regex = new RegExp(' ', 'g');
    const spaceNum = value.match(regex);
    const count = !spaceNum ? 0 : spaceNum.length;
    if (count === value.length || !value.match(/^[a-zA-Z\u4e00-\u9fa5_\s*]{2,40}$/)) {
      return {'invalidAccount': true};
    } else {
      return null;
    }
  }

  static idNameValidator(control) {
    if (!control.value.match(/^[\u4e00-\u9fa5A-Za-z]*$/)) {
      return {'invalidAccount': true};
    } else {
      return null;
    }
  }

  // 中英文数字
  static customValidator(control) {
    if (!control.value.match(/^[\u4e00-\u9fa5A-Za-z@0-9]*$/)) {
      return {'invalidAccount': true};
    } else {
      return null;
    }
  }

  // 特殊符号不匹配
  static nameValidator(control) {
    if (control.value.match("[`~!@%#$^&*()=|{}':;',\\[\\].<>/?~！@#￥……&*（）——|{}【】‘；：”“'。，、？]")) {
      return {'invalidAccount': true};
    } else {
      return null;
    }
  }

  /**
   * 证件号 、证件类型 、国籍
   * {idNo: {num: '', certificate: ''}, country: '' }
   * @param {string} ID
   * @param {string} country
   * @returns {(group: FormGroup) => {[p: string]: any}}
   */
  static matChingIDNum(ID: string, country?: string) {
    return (group: FormGroup): { [key: string]: any } => {
      const IDNum = group.controls[ID].value['num'];
      const certificateType = group.controls[ID].value['certificate'];
      const regex = '/^([1-9]\\d{5}(19\\d{2}|200\\d{1})((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{2}$)/';
      // if (IDNum.match(/[\u4E00-\u9FA5]/g)) {  // 输入的id 带有汉字
      //   return {'invalidIdNum': true};
      // }

      if (IDNum.value && !IDNum.match(/^[0-9a-zA-Z]+$/)) {
        return {'invalidIdNum': true};
      }
      if (country) {
        const countryType = group.controls[country].value;
        if (certificateType === '1' && countryType === '100000' && !IDNum.match(/^([1-9]\d{5}(19\d{2}|200\d{1})((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$)/)) {
          return {'invalidIdNum': true};
        } else {
          return null;
        }
      } else {
        if (certificateType === '1' && !IDNum.match(/^([1-9]\d{5}(19\d{2}|200\d{1})((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$)/)) {
          return {'invalidIdNum': true};
        } else {
          return null;
        }
      }
    };
  }

  // 英文和数字
  static certificateValidator(control) {
    if (!control.value.match(/^[0-9a-zA-Z]+$/)) {
      return {'invalidAccount': true};
    } else {
      return null;
    }
  }

  static IDnumValidator(control) {
    if (!control.value.match(/^([1-9]\d{5}(19\d{2}|200\d{1})((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$)/)) {
      return {'invalidIdNum': true};
    } else {
      return null;
    }
  }

  // input 设置最大值 @auth baoww765
  static maxVal(max: number): ValidatorFn {
    return (control: FormControl): { [key: string]: boolean } | null => {
      const val: number = control.value;
      if (control.pristine || control.pristine) {
        return null;
      }
      if (val <= max) {
        return null;
      }
      return {'max': true};
    };
  }

  // 众筹 判断众筹结束时间必须早于活动开始时间 @auth baoww765
  static endTime(startTime: any): ValidatorFn {
    // console.log(startTime);
    return (control: FormControl): { [key: string]: boolean } | null => {
      const val = control.value;
      const endString = val.split('T');
      let end = endString[0] + ' ' + endString[1];
      const safariEndTime = end.split('-');
      end = safariEndTime[0] + '/' + safariEndTime[1] + '/' + safariEndTime[2];
      const endTimestamp = new Date(end).getTime();
      if (control.pristine || control.pristine) {
        return null;
      }
      if (endTimestamp <= startTime) {
        return null;
      }
      return {'end': true};
    };
  }

  // 判断输入金额(min:最小值，max:最大值) lih1157
  static moneyValidator(min?: number, max?: number): ValidatorFn {
    return (control: FormControl): { [key: string]: boolean } | null => {
      const val: string = control.value;

      if (min && max && val) {
        if (Number(val) >= min && Number(val) <= max &&
          val.match(/(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/)) {
          return null;
        }
      } else if (min && val) {
        if (Number(val) >= min && val.match(/(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/)) {
          return null;
        }
      } else if (max && val) {
        if (Number(val) <= max && val.match(/(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/)) {
          return null;
        }
      } else {
        if (val && val.match(/(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/) && Number(val) >= 0) {
          return null;
        }
      }

      return {'invalidIdNum': true};
    };
  }
}
